package com.ideaaedi.springcloud.jd.user.db;

import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import cn.smallbun.screw.core.process.ProcessConfig;
import com.google.common.collect.Lists;
import com.ideaaedi.commonds.path.PathUtil;
import com.ideaaedi.springcloud.jd.user.UserApplication;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;

/**
 * screw-core 生成 数据库表结构文档
 * <a href="https://toscode.gitee.com/leshalv/screw">官网说明</a>
 *
 * @author <font size = "20" color = "#3CAA3C"><a href="https://gitee.com/JustryDeng">JustryDeng</a></font> <img src="https://gitee.com/JustryDeng/shared-files/raw/master/JustryDeng/avatar.jpg" />
 * @since 2021.0.1.C
 */
@SpringBootTest(classes = UserApplication.class)
class DbDocHelper {
    
    @Value("${spring.datasource.url}")
    private String url;
    
    @Value("${spring.datasource.username}")
    private String username;
    
    @Value("${spring.datasource.password}")
    private String password;
    
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    
    @Test
    void generate() {
        String outputRootDir = PathUtil.getProjectRootDir(DbDocHelper.class)
                .replace("/target/test-classes/", "/src/main/resources/db-doc/");
        /// 先清空文件夹
        ///IOUtil.delete(new File(outputRootDir));
        
        // 数据源
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName(driverClassName);
        hikariConfig.setJdbcUrl(url);
        hikariConfig.setUsername(username);
        hikariConfig.setPassword(password);
        // 设置可以获取tables remarks信息
        hikariConfig.addDataSourceProperty("useInformationSchema", "true");
        hikariConfig.setMinimumIdle(2);
        hikariConfig.setMaximumPoolSize(5);
        DataSource dataSource = new HikariDataSource(hikariConfig);
        
        //设置生成pojo相关配置
        // 文件生成配置
        EngineConfig engineConfig = EngineConfig.builder()
                // 生成文件存放的目录
                .fileOutputDir(outputRootDir)
                // 生成完成是否打开输出目录
                .openOutputDir(false)
                // 生成文件类型：HTML-> .html，WORD-> .doc、MD-> .md
                .fileType(EngineFileType.HTML)
                // 生成模板实现
                .produceType(EngineTemplateType.freemarker)
                // 自定义文件名称
                .fileName("库表说明")
                .build();
        
        // 数据处理配置
        ProcessConfig processConfig = ProcessConfig.builder()
                // 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时，将生成指定表，其余表不生成、并跳过忽略表配置
                // 根据名称指定表生成
                .designatedTableName(Lists.newArrayList())
                // 根据表前缀生成
                .designatedTablePrefix(Lists.newArrayList())
                // 根据表后缀生成
                .designatedTableSuffix(Lists.newArrayList())
                // 忽略指定名称的表
                .ignoreTableName(Lists.newArrayList())
                // 忽略指定名称前缀的表
                .ignoreTablePrefix(Lists.newArrayList())
                // 忽略指定名称后缀的表
                .ignoreTableSuffix(Lists.newArrayList())
                .build();
        
        // Screw 配置入口
        Configuration config = Configuration.builder()
                // 版本
                .version("1.0.0")
                // 生成的文档里面，对当前文档的描述
                .description("数据库设计文档")
                // 数据源
                .dataSource(dataSource)
                // 文档生成配置
                .engineConfig(engineConfig)
                // 数据处理配置
                .produceConfig(processConfig)
                .build();
        // 执行生成文档
        new DocumentationExecute(config).execute();
    }
}
